﻿using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace DoNet.ApiHttpClient
{
    /// <summary>
    /// HttpClient请求响应结果
    /// </summary>
    public class HttpClientResponse
    {
        #region 
        /// <summary>
        /// 接口返回的 HttpResponseMessage
        /// </summary>
        public HttpResponseMessage HttpResponse;
        /// <summary>
        /// 应答返回是否成功
        /// </summary>
        public bool IsResponse = false;
        /// <summary>
        /// 响应的头部信息
        /// </summary>
        public HttpResponseHeaders ResponseHeaders;
        /// <summary>
        /// 响应的内容头部的信息
        /// </summary>
        public HttpContentHeaders ResponseContentHeaders;
        /// <summary>
        /// 应答主体（response Body）
        /// </summary>
        public string ResponseBody = "";
        /// <summary>
        /// 返回数据 bytes (返回文件数据时)
        /// </summary>
        public byte[] ResponseBytes = null;
        #endregion

        public HttpClientResponse(HttpResponseMessage response)
        {
            this.HttpResponse = response;
            this.ResponseHeaders = HttpResponse.Headers;
            this.ResponseContentHeaders = HttpResponse.Content.Headers;

            // 检查响应状态码
            if (response.IsSuccessStatusCode)
            {
                //OK 等效于 HTTP 状态 200。OK 指示请求成功，且请求的信息包含在响应中。这是最常接收的状态代码。
                //NoContent 等效于 HTTP 状态 204。NoContent 指示已成功处理请求并且响应已被设定为无内容。
                this.IsResponse = true;
            }
        }

        /// <summary>
        /// 同步读取响应内容 （初始化类之后，一定更要执行此方法才可以获取返回的内容，构造函数中不能调用异步执行方法，故采用此方法获取返回的数据）
        /// </summary>
        /// <returns></returns>
        public void GetResponseBody()
        {
            this.ResponseBody = HttpResponse.Content.ReadAsStringAsync().Result;
        }

        /// <summary>
        /// 异步读取响应内容 （初始化类之后，一定更要执行此方法才可以获取返回的内容，构造函数中不能调用异步执行方法，故采用此方法获取返回的数据）
        /// </summary>
        /// <returns></returns>
        public async Task GetResponseBodyAsync()
        {
            this.ResponseBody = await HttpResponse.Content.ReadAsStringAsync();
        }

        /// <summary>
        /// 同步获取文件Bytes （初始化类之后，一定更要执行此方法才可以获取返回的文件Bytes，构造函数中不能调用异步执行方法，故采用此方法获取返回的文件Bytes）
        /// </summary>
        /// <returns></returns>
        public void GetResponseBytes()
        {
            using (Stream contentStream = HttpResponse.Content.ReadAsStreamAsync().Result)
            {
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    contentStream.CopyTo(memoryStream);
                    this.ResponseBytes = memoryStream.ToArray();
                }
            }
        }

        /// <summary>
        /// 异步获取文件Bytes （初始化类之后，一定更要执行此方法才可以获取返回的文件Bytes，构造函数中不能调用异步执行方法，故采用此方法获取返回的文件Bytes）
        /// </summary>
        /// <returns></returns>
        public async Task GetResponseBytesAsync()
        {
            using (Stream contentStream = await HttpResponse.Content.ReadAsStreamAsync())
            {
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    contentStream.CopyTo(memoryStream);
                    this.ResponseBytes = memoryStream.ToArray();
                }
            }
        }
    }
}
